/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.comandos.admin;

import br.ufc.quixada.adrs.interfaces.Comando;
import br.ufc.quixada.adrs.model.Adrs;
import br.ufc.quixada.adrs.model.Contato;
import br.ufc.quixada.adrs.model.Endereco;
import br.ufc.quixada.adrs.model.Papel;
import br.ufc.quixada.adrs.model.Usuario;
import br.ufc.quixada.adrs.service.AdrsService;
import br.ufc.quixada.adrs.service.MunicipioService;
import br.ufc.quixada.adrs.service.PapelService;
import br.ufc.quixada.adrs.util.Msg;
import br.ufc.quixada.adrs.util.Paginacao;
import br.ufc.quixada.adrs.util.SendMail;
import br.ufc.quixada.adrs.util.UtilAdrs;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.LoggerFactory;

/**
 *
 * @author ismaily
 */
public class CmdAddAdrs implements Comando {

    public String executa(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession(true);

        //session.setAttribute("listaAdrs", adrsService.getAllAdrs());
        String nome = (String) request.getParameter("nome");
        session.setAttribute("nome", nome);
        String apelido = (String) request.getParameter("apelido");
        session.setAttribute("apelido", apelido);
        String cpf = (String) request.getParameter("cpf");
        session.setAttribute("cpf", cpf);
        String rg = (String) request.getParameter("rg");
        session.setAttribute("rg", rg);
        String email = (String) request.getParameter("email");
        session.setAttribute("email", email);
        String login = (String) request.getParameter("login");
        session.setAttribute("login", login);
        String estado = (String) request.getParameter("estado");
        String cidade = (String) request.getParameter("cidade");
        String localidade = (String) request.getParameter("localidade");
        session.setAttribute("localidade", localidade);
        String distancia = (String) request.getParameter("distancia");
        session.setAttribute("distancia", distancia);
        String tel1 = (String) request.getParameter("tel1");
        session.setAttribute("tel1", tel1);
        String tel2 = (String) request.getParameter("tel2");
        session.setAttribute("tel2", tel2);

        List<Contato> contatos = new ArrayList<Contato>();

        if (cpf.length() < 14) {
            session.setAttribute("erro", Msg.INPUT_ERROR_INVALID_CPF);
            return "/admin/admin_add_adrs.jsp";
        }
        cpf = UtilAdrs.desFormataCPF(cpf);
        if (tel1 == null || tel1.trim().equals("")) {
            session.setAttribute("erro", Msg.REQUIRED_PHONE_FIELD_1);
            return "/admin/admin_add_adrs.jsp";
        }
        if (tel2 == null || tel2.trim().equals("")) {
            tel2 = "não informado";
        }

        Adrs adrs = null;
        Long id = (Long) session.getAttribute("idAdrs");
        MunicipioService ms = null;
        AdrsService as = null;
        if (rg == null || email == null || cpf == null || apelido == null || nome == null || login == null || localidade == null || distancia == null
                || cidade == null || estado == null || apelido.trim().isEmpty() || cpf.trim().isEmpty()
                || rg.trim().isEmpty() || email.trim().isEmpty() || nome.trim().isEmpty() || login.trim().isEmpty() || localidade.trim().isEmpty()
                || distancia.trim().isEmpty() || cidade.trim().isEmpty() || estado.trim().isEmpty()) {

            session.setAttribute("erro", Msg.REQUIRED_FIELDS);
            return "/admin/admin_add_adrs.jsp";
        } else if (estado.equals("-1") || cidade.equals("-1")) {
            session.setAttribute("erro", Msg.REQUIRED_FIELDS);
            return "/admin/admin_add_adrs.jsp";
        } else if (id == null) {
            if (!UtilAdrs.isNumber(cpf)) {
                session.removeAttribute("cpf");
                session.setAttribute("erro", Msg.NOT_NUMERIC_CPF);
                return "/admin/admin_add_adrs.jsp";
            }
            if (!UtilAdrs.isNumber(distancia)) {
                session.removeAttribute("distancia");
                session.setAttribute("erro", Msg.NOT_NUMERIC_DISTANCIA);
                return "/admin/admin_add_adrs.jsp";
            }
            ms = new MunicipioService();
            as = new AdrsService();

            Endereco e = new Endereco();
            e.setDistanciaSede(Integer.parseInt(distancia));
            e.setLocalidade(localidade);
            e.setMunicipio(ms.getMunicipioById(Long.parseLong(cidade)));

            Usuario u = new Usuario();
            u.setNome(nome);
            u.setCpf(cpf);
            u.setApelido(apelido);
            u.setLogin(login);
            u.setSenha(UtilAdrs.criptografar("bbadrsufc"));
            u.setEmail(email);
            u.setRg(rg);
            u.setEndereco(e);

            Adrs p = new Adrs();
            p.setAtivo(true);
            p.setDataCriacao(new Date());
            p.setUsuario(u);
            p.setPapel(new PapelService().getPapelById(Papel.PAPEL_ADRS));

            Contato cont1 = new Contato();
            tel1.replace("(", "");
            tel1.replace(")", "");
            tel1.replace("-", "");
            cont1.setNumero(tel1);
            cont1.setUsuario(u);

            contatos.add(cont1);
            Contato cont2 = new Contato();
            cont2.setNumero(tel2);
            cont2.setUsuario(u);

            contatos.add(cont2);
            u.setContatos(contatos);

            String validationMessage = as.validaParaInsercao(p);
            if (!validationMessage.equals(Msg.OK)) {
                session.setAttribute("erro", validationMessage);
                return "/admin/admin_add_adrs.jsp";
            }

            if (as.insertAdrs(p)) {
                session.removeAttribute("nome");
                session.removeAttribute("email");
                session.removeAttribute("apelido");
                session.removeAttribute("cpf");
                session.removeAttribute("rg");
                session.removeAttribute("distancia");
                session.removeAttribute("tel1");
                session.removeAttribute("tel2");
                session.removeAttribute("login");
                session.removeAttribute("localidade");
                try {
                    String mensagem = "Prezado(a) " + u.getNome() + " Acabamos de receber seu cadastro no sistema ADRS. Para acessar o sistema:\n"
                            + "Seu login é: " + u.getLogin() + ". A sua senha é: bbadrsufc" + "\n"
                            + "Bom trabalho!";
                    SendMail.sendMail(email, "Novo cadastro no sistema ADRS.", mensagem);
                } catch (AddressException ex) {
                    LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
                } catch (MessagingException ex) {
                    LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
                }
                session.setAttribute("sucesso", Msg.ADRS_SUCCESSFULLY_REGISTERED);
                Paginacao.atualizarListaAdrs(as, session, 1l, 0l);
                return "/admin/admin_gerenciar_adrs.jsp";
            } else {
                session.setAttribute("erro", Msg.OPERATIONAL_ERROR_REGISTERING_ADRS);
                return "/admin/admin_gerenciar_adrs.jsp";
            }
        } else {
            adrs = new AdrsService().getAdrsById(id);
            contatos = adrs.getUsuario().getContatos();
            if (!UtilAdrs.isNumber(rg)) {
                session.setAttribute("erro", Msg.NOT_NUMERIC_RG);
                return "/admin/admin_add_adrs.jsp";
            }
            if (!UtilAdrs.isNumber(cpf)) {
                session.setAttribute("erro", Msg.NOT_NUMERIC_CPF);
                return "/admin/admin_add_adrs.jsp";
            }
            if (!UtilAdrs.isNumber(distancia)) {
                session.setAttribute("erro", Msg.NOT_NUMERIC_DISTANCIA);
                return "/admin/admin_add_adrs.jsp";
            }
            ms = new MunicipioService();
            as = new AdrsService();
            Endereco e = adrs.getUsuario().getEndereco();
            e.setDistanciaSede(Integer.parseInt(distancia));
            e.setLocalidade(localidade);
            e.setMunicipio(ms.getMunicipioById(Long.parseLong(cidade)));

            Usuario u = adrs.getUsuario();
            u.setNome(nome);
            u.setCpf(cpf);
            u.setApelido(apelido);
            u.setLogin(login);
            u.setEndereco(e);
            u.setRg(rg);
            u.setEmail(email);

            Contato cont1 = contatos.get(0);
            cont1.setNumero(tel1);
            cont1.setUsuario(u);

            Contato cont2 = contatos.get(1);
            cont2.setNumero(tel2);
            cont2.setUsuario(u);

            u.setContatos(contatos);

            Adrs p = new Adrs();
            p.setUsuario(u);

            String validationMessage = as.validaParaEdicao(p);
            if (!validationMessage.equals(Msg.OK)) {
                session.setAttribute("erro", validationMessage);
                return "/admin/admin_add_adrs.jsp";
            }

            if (as.updateAdrs(p)) {
                //session.setAttribute("listaAdrs", adrsService.getAllAdrs());
                session.removeAttribute("nome");
                session.removeAttribute("email");
                session.removeAttribute("apelido");
                session.removeAttribute("cpf");
                session.removeAttribute("rg");
                session.removeAttribute("distancia");
                session.removeAttribute("tel1");
                session.removeAttribute("tel2");
                session.removeAttribute("login");
                session.removeAttribute("localidade");
                session.removeAttribute("idAdrs");
                session.removeAttribute("nomeComando");
                Paginacao.atualizarListaAdrs(as, session, 1l, 0l);
                session.setAttribute("sucesso", Msg.SUCCESSFULLY_EDITED);
            } else {
                session.setAttribute("erro", Msg.OPERATIONAL_ERROR_REGISTERING_ADRS);
            }
            return "/admin/admin_gerenciar_adrs.jsp";
        }
    }
}
